package com.cedancp.hometrade;

import java.util.ArrayList;
import java.util.HashMap;

import org.json.JSONException;
import org.json.JSONObject;

import library.ConnectionDetector;
import library.UserFunctions;
import android.R.integer;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.ListActivity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;

public class ListaPublicaciones extends ListActivity {
	
	ConnectionDetector cd;
	private ProgressDialog pDialogo;
	ArrayList<HashMap<String, String>> publicacionesList;
	UserFunctions userFunction = new UserFunctions();
	public boolean ultimo=false;
	int tipo;
	int ciudad;
	int precio;
	boolean bandera=false;
	int totalitem;
	int visibles;
	String tipo_lista="";
	

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_lista_publicaciones);
		
		//verificando si hay extras
		Intent i=getIntent();
		Bundle extras = i.getExtras();
		setTitle("Publicaciones");
		if (extras != null) {
			tipo_lista=extras.getString("tipo_lista");
			if(tipo_lista.compareTo("favoritos")==0){
				setTitle("Favoritos");
			}
			if(tipo_lista.compareTo("adm_pub")==0){
				setTitle("Mis Publicaciones");
			}
			}
			if(tipo_lista.compareTo("buscar")==0){
				setTitle("Busqueda");
			    tipo=extras.getInt("tipo");
			    ciudad=extras.getInt("ciudad");
			    precio=extras.getInt("precio");
			    bandera=true;
			}
		
		//verificando conexion
		cd= new ConnectionDetector(getApplicationContext());
		
		if(!cd.isConnectingToInternet()){
			Context context = getApplicationContext();
			int duration = Toast.LENGTH_SHORT;

			Toast toast = Toast.makeText(context, "Error de conexion", duration);
			toast.show();
			return;
		}
		
		publicacionesList=new ArrayList<HashMap<String, String>>();
		
		new loadPublicaciones().execute(0);
		
		final ListView lv=getListView();
		
		lv.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {
			

			@Override
			public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
					long arg3) {
				if(tipo_lista.compareTo("adm_pub")==0){
					Intent i=new Intent(getApplicationContext(),EditPubicacion.class);
					String publi_id=((TextView) arg1.findViewById(R.id.publi_id)).getText().toString();
					i.putExtra("cod_publicacion", publi_id);
					startActivity(i);
				}
				else{
					Intent i=new Intent(getApplicationContext(),DetallePublicacion.class);
					String publi_id=((TextView) arg1.findViewById(R.id.publi_id)).getText().toString();
					i.putExtra("cod_publicacion", publi_id);
					startActivity(i);
				}
				
			}
		});
		
		lv.setOnScrollListener(new OnScrollListener() {
			
	        private int paginaActual = 0;
	        private int totalAnteriorItems = 0;
	        private boolean loading = true;
	        private boolean bandera2 = false;
	       
			
			public void onScrollStateChanged(AbsListView view, int scrollState) {
				// TODO Auto-generated method stub
				if(scrollState==SCROLL_STATE_TOUCH_SCROLL){
					bandera2=true;					
				}
				
			}
			
			public void onScroll(AbsListView view, int firstVisibleItem,
					int visibleItemCount, int totalItemCount) {
				
				if(loading){
					if(totalItemCount>totalAnteriorItems){
						totalAnteriorItems=totalItemCount;
						loading=false;
						paginaActual++;
					}
					
				}
				if(!loading && (totalItemCount - visibleItemCount) <= (firstVisibleItem)&&bandera2&&!ultimo){
					new loadPublicaciones().execute(paginaActual);
					totalitem=totalItemCount;
					visibles=visibleItemCount;
					loading=true;					
					bandera2=false;
				}
			}
		});
		
		
		
	}
	
	class loadPublicaciones extends AsyncTask<Integer, String, String>{
		
		
		@Override
		public void onPreExecute(){
			super.onPreExecute();
			pDialogo=new ProgressDialog(ListaPublicaciones.this);
			pDialogo.setMessage("cargando...");
			pDialogo.setIndeterminate(false);
            pDialogo.setCancelable(false);
            pDialogo.show();
		}
		
		@Override
		protected String doInBackground(Integer... pag){
				Integer pagina=pag[0];
				String mensaje=null;
				JSONObject json=userFunction.listPublicaciones(getApplicationContext(),pagina);
				if(bandera){
					json=userFunction.listBusqueda(getApplicationContext(), pagina, tipo, ciudad, precio);
				}
				if(tipo_lista.compareTo("favoritos")==0){
					json=userFunction.getFavoritos(getApplicationContext(), pagina);
				}
				if(tipo_lista.compareTo("adm_pub")==0){
					json=userFunction.getMisPublicaciones(getApplicationContext(), pagina);
				}
				
					try {
						String error=json.getString("error");
						if((error.compareTo("0"))==0){
							int i=0;
							while(json.getString(""+i).compareTo("final")!=0&&json.getString(""+i).compareTo("last")!=0)
							{
								JSONObject c=json.getJSONObject(""+i);
								String id=c.getString("cod");
								String titulo=c.getString("titulo");
								HashMap<String, String> map=new HashMap<String, String>();
								
								map.put("cod", id);
								map.put("titulo", titulo);
								publicacionesList.add(map);
								i++;
							}
							if (json.getString(""+i).compareTo("last")==0) {
								ultimo=true;
								mensaje="No hay mas publicaciones";
							}
						}else{
							Log.d("Publicaciones: ", "null");
							if(!ultimo){
								mensaje=json.getString("error_msg");
							}
						}
					} catch (JSONException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					return mensaje;		
		}
		
		@Override
		protected void onPostExecute(String mensaje){
			pDialogo.dismiss();
			if(mensaje!=null){
				Toast.makeText(getApplicationContext(), mensaje, Toast.LENGTH_SHORT).show();
			}
			runOnUiThread(new Runnable() {
				public void run(){
					ListAdapter adapter=new SimpleAdapter(
							ListaPublicaciones.this, 
							publicacionesList, 
							R.layout.list_item_publicaciones, 
							new String[] {"cod","titulo"}, 
							new int[] {R.id.publi_id,R.id.publi_name});
					
					setListAdapter(adapter);					
					
				}
			});
			ListView lv=getListView();
			lv.setSelection(totalitem-visibles);
			
		}
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.lista_publicaciones, menu);
		return true;
	}
	
	
	//Creando los eventos de las opciones de menu
	@Override
    public boolean onOptionsItemSelected(MenuItem item){
		UserFunctions userFunction= new UserFunctions();
    	switch (item.getItemId()) {
		case R.id.mnu_salir:
			if(userFunction.logoutUser(getApplicationContext())){
				Intent mainActivity=new Intent(getApplicationContext(), MainActivity.class);
				mainActivity.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
				startActivity(mainActivity);
			}
			
			return true;
		case R.id.mnu_publicar:
			Intent intent =new Intent(getApplicationContext(), AddPublicacion.class);
			startActivity(intent);
			return true;
		
		case R.id.mnu_busqueda:
			Intent iBuscar =new Intent(getApplicationContext(), BuscarPub.class);
			startActivity(iBuscar);
			return true;
			
		case R.id.mnu_cuenta:
				Intent iCuenta =new Intent(getApplicationContext(), AdministrarCuenta.class);
				startActivity(iCuenta);
				return true;
				
		case R.id.acercaDe:
				Intent iAcercaDe = new Intent(getApplicationContext(), AcercaDe.class);
				startActivity(iAcercaDe);
				return true;

		default:
			return super.onOptionsItemSelected(item);
		}
    }

}
